﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OfficeOpenXml;
using System.IO;
using Microsoft.Win32;
using System.Diagnostics;
using System.Windows.Shapes;
using System.Data;


namespace TestFireBroadcastingHostPhone.Product
{
    public class ProductExcel
    {
        /// <summary>
        /// 根据广播产品ID信息更新读取产品型号
        /// </summary>
        /// <param name="productID"></param>
        /// <param name="err_info"></param>
        /// <param name="path"></param>
        public string Excel_ReadLampDataUpdate(string productID, out string err_info, string path)
        {
            string producType = string.Empty;
            err_info = string.Empty;
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (var package = new ExcelPackage(new FileInfo(path)))
            {
                if (package.Workbook.Worksheets.Count > 0)
                {
                    ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假设数据都在第一个工作表
                    int idCol = FindColumnIndexByName(worksheet, "品号");
                    int typeCol = FindColumnIndexByName(worksheet, "型号");

                    if (idCol <= 0 || typeCol <= 0)
                    {
                        err_info = "缺少必要的列名: 品号, 型号";
                        return producType;
                    }

                    int rowToUpdate = FindRowByLampInfo(worksheet, productID, idCol);
                    if (rowToUpdate > 0)
                    {
                        producType = worksheet.Cells[rowToUpdate, typeCol].Text.Trim();
                    }
                    else
                    {
                        err_info = $"未找到与产品ID '{productID}' 对应的行";
                    }
                }
                else
                {
                    err_info = "工作表不存在!";
                }
            }
            return producType;
        }

        /// <summary>
        /// 遍历表头
        /// </summary>
        /// <param name="worksheet">工作表：sheet</param>
        /// <param name="columnName">表头名字</param>
        /// <returns></returns>
        private int FindColumnIndexByName(ExcelWorksheet worksheet, string columnName)
        {
            for (int col = 1; col <= worksheet.Dimension.End.Column; col++)
            {
                if (worksheet.Cells[1, col].Text == columnName)
                {
                    return col;
                }
            }
            return -1; // 如果没有找到列，则返回-1
        }
        /// <summary>
        /// 遍历对应行
        /// </summary>
        /// <param name="worksheet">工作表</param>
        /// <param name="lampinfo">灯具信息</param>
        /// <param name="infoCol">灯具信息对应行</param>
        /// <returns>需要更新的行</returns>
        private int FindRowByLampInfo(ExcelWorksheet worksheet, string lampinfo, int infoCol)
        {
            for (int row = 2; row <= worksheet.Dimension.End.Row; row++) // 从第二行开始查找，跳过表头
            {
                if (worksheet.Cells[row, infoCol].Text == lampinfo)
                {
                    return row;
                }
            }
            return -1; // 如果没有找到对应的行，则返回-1
        }

        #region --垃圾回收机制
        //变量定义
        /// <summary>
        /// 是否已释放资源的标志
        /// </summary>
        private bool m_disposed = false;

        /// <summary>
        /// 释放内存中所占的资源
        /// </summary>
        public void Dispose()
        {
            Dispose(true);   //释放托管和非托管资源

            //将对象从垃圾回收器链表中移除，
            // 从而在垃圾回收器工作时，只释放托管资源，而不执行此对象的析构函数
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// 无法直接调用的资源释放函数
        /// </summary>
        /// <param name="disposing"></param>
        // 参数为true表示释放所有资源，只能由使用者调用
        // 参数为false表示释放非托管资源，只能由垃圾回收器自动调用
        // 如果子类有自己的非托管资源，可以重载这个函数，添加自己的非托管资源的释放
        // 但是要记住，重载此函数必须保证调用基类的版本，以保证基类的资源正常释放
        protected virtual void Dispose(bool disposing)
        {
            if (!m_disposed)
            {
                if (disposing)
                {
                    //释放托管资源   
                }
                //释放非托管资源        
                m_disposed = true;   //标志此对象已被释放
            }
        }

        /// <summary>
        /// 析构函数
        /// 由垃圾回收器调用，释放非托管资源
        /// </summary>
        ~ProductExcel()
        {
            Dispose(false);
        }

        #endregion
    }
}
